package models

import (
	"gin_gorm_oj/core"
	"time"

	"gorm.io/gorm"
)

// Base 所有模型的基础结构
type Base struct {
	// ID 主键ID，用于数据库表的唯一标识，使用primaryKey标签指定为主键
	ID uint `gorm:"primaryKey" json:"id"`
	// CreatedAt 创建时间，记录数据创建时的时间戳
	CreatedAt time.Time `json:"created_at"`
	// UpdatedAt 更新时间，记录数据最后更新的时间戳
	UpdatedAt time.Time `json:"updated_at"`
}

// DB 全局数据库连接实例
// 从core包导入预初始化的数据库连接
var DB = core.DB

// QueryByKeyword 通用关键词搜索查询构建方法
// 使用示例: db := QueryByKeyword[Problem]("搜索词")
func QueryByKeyword[T any](keyword string) *gorm.DB {
	// 创建指定类型的模型实例
	// 构建WHERE条件，在title或content字段中进行关键词模糊匹配
	// 使用通配符%包裹关键词实现模糊搜索
	return DB.Model(new(T)).Where(
		"title LIKE ? OR content LIKE ?", // SQL条件：标题或内容包含关键词
		"%"+keyword+"%", "%"+keyword+"%", // 参数：带通配符的关键词
	)
}

// Page 通用分页查询构建方法
// 使用示例:
// tx := DB.Model(&Problem{}).Where("title LIKE ?", "%关键词%")
// tx = Page[Problem](tx, 1, 20)  // 只是构建查询，不执行
// var problems []Problem
// err := tx.Find(&problems).Error
func Page[T any](tx *gorm.DB, page, size int) *gorm.DB {
	// 计算偏移量：(页码-1)*每页大小
	offset := (page - 1) * size
	// 应用偏移量和限制数量到查询构建器
	return tx.Offset(offset).Limit(size)
}
